<template>
  <div class="loginpage">
    <div class="content">
        <h2>商城App后台管理系统</h2>
        <!-- 引入element的单个控件，使用原生form表单 -->
        <el-form :model="loginObj" :rules="loginRules" ref="ruleFormRef">
            <el-form-item label="UserName:" class="item_label" prop="uname">
                <el-input placeholder="请输入邮箱/手机号码登录" class="item_input" v-model.lazy.trim="loginObj.uname" />
            </el-form-item>

            <el-form-item label="PassWord:" class="item_label" prop="upwd">
                <el-input placeholder="请输入登录密码" show-password class="item_input" v-model.lazy.trim="loginObj.upwd" />
            </el-form-item>

            <el-form-item prop="isAgreen">
                <el-checkbox v-model="loginObj.isAgreen">已阅读并同意《服务条款》</el-checkbox>
            </el-form-item>
            <!-- el-button上的color属性是指修改按钮的背景颜色 -->
            <el-form-item>
                <el-button type="primary" color="darkcyan" class="txtcol" @click="onLogin(ruleFormRef)">登录</el-button>
            </el-form-item>
        </el-form>
    </div>
  </div>
</template>

<script setup>
import { ElMessage } from "element-plus";
import { inject, reactive, ref } from "vue";
import { md5 } from "js-md5";
// import { useRouter } from "vue-router";
import router from "@/router";
//订阅$axios
const $axios = inject('$axios');
//路由实例对象
// const router = useRouter()
//组件创建完后，自动捕获表单的DOM对象
const ruleFormRef = ref('');
//表单数据绑定对象
let loginObj = reactive({
    uname : '',
    upwd : '',
    isAgreen : false,
})

// 自定义验证复选框
const RuleAgreen = (rule,value,callback)=>{
    //如果没有勾选复选框则报错，勾选了则正常登录
    if(!value){
        callback(new Error('必须勾选该项！') );
    }else{
        callback();
    }
}
// 验证规则对象
const loginRules = reactive({
    //针对第一个账号输入框进行失去焦点时，非空验证
    uname : [
        {required:true , message:'必须填写登录账号！',trigger:'blur'}
    ],
    upwd : [
        {required:true , message:'必须填写登录密码！',trigger:'blur'}
    ],
    isAgreen : [
        //自定义验证规则，那么必须保证自定义验证函数在规则对象之前创建
        {validator : RuleAgreen , triggen:'change'}
    ]
})

//提交表单
const onLogin = (formEl)=>{
    //提取rules的验证规则结果
    // 非setup写法：this.$refs[formEl].validate((val)=>{
    formEl.validate((val)=>{
        //val为true，表示所有的rules验证都通过
        if( val ){
            //整合需要提交给后端的数据
            let data = {
                username : loginObj.uname,
                password : md5( loginObj.upwd)
            }
            //向登录接口发送请求
            $axios.post('/login' , data).then( (res)=>{
                if(res.code === '200'){
                    router.push('/admin/index');
                    localStorage.setItem('user',JSON.stringify(res.data))
                }else{
                    ElMessage.error(res.msg);
                }
                
            } ).catch( (error)=>{
                if(error.response == undefined || error.response.data == undefined){
                    ElMessage.error(error);

                }else{
                    ElMessage.error(error.response.data);
                }
            })

        }else{
            ElMessage.error('登录失败，请重新登录！')
            return false;
        }
    } )
}
</script>

<style scoped>
.loginpage{
    width: 100%;
    height: 100vh;
    overflow: hidden;
    background-color: #2a2a33;
    position: relative;
}
.loginpage  .content{
    width: 400px;
    background-color: rgba(255, 255, 255, 0.8);
    box-shadow: 0px 0px 8px white;
    border-radius: 10px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}
.loginpage .content h2{
    color: darkcyan;
    line-height: 80px;
    text-align: center;
    font-size: 24px;
    font-family: "黑体";
}
/* 当使用第三方UI框架时需要修改样式的情况，观察浏览器的最终组件效果： */
/* 情况1：结构比较简单，组件直接生成对应的标签，如el-form直接生成form标签的情况，可以直接针对标签进行样式修改 */
.loginpage .content form{
    width: 90%;
    margin: 0 auto;
}
.loginpage .content button{
    width: 100%;
}
/* :deep()穿刺（存在兼容性问题，移动端不显示） */
.loginpage .content :deep(button>span) {
    color: white !important; 
}
/* 情况1：结构比较复杂，组件生成多层结构，如el-form-item生成div+div+label结构的情况，采用自定义class选择器设置到组件上的操作 */
.loginpage .content .item_label{
    font-weight: 600;
}
.loginpage .content .item_input{
    border: 1px solid gray;
    border-radius: 6px;
    line-height: 40px;
    overflow: hidden;
}
.el-checkbox{
    color: black;
}
</style>